#ifndef _BM_THERMAL_H_
#define _BM_THERMAL_H_
#include "bm_common.h"

#define tempsen_top_tempsen_version                       0x0
#define tempsen_top_tempsen_ctrl                          0x4
#define tempsen_top_tempsen_status                        0x8
#define tempsen_top_tempsen_set                           0xc
#define tempsen_top_tempsen_intr_en                       0x10
#define tempsen_top_tempsen_intr_clr                      0x14
#define tempsen_top_tempsen_intr_sta                      0x18
#define tempsen_top_tempsen_intr_raw                      0x1c
#define tempsen_top_tempsen_ch0_result                    0x20
#define tempsen_top_tempsen_ch1_result                    0x24
#define tempsen_top_tempsen_ch2_result                    0x28
#define tempsen_top_tempsen_ch3_result                    0x2c
#define tempsen_top_tempsen_ddr_temp_ctrl                 0x30
#define tempsen_top_tempsen_ddr_temp_th                   0x34
#define tempsen_top_tempsen_ch0_temp_th                   0x40
#define tempsen_top_tempsen_ch1_temp_th                   0x44
#define tempsen_top_tempsen_ch2_temp_th                   0x48
#define tempsen_top_tempsen_ch3_temp_th                   0x4c
#define tempsen_top_Overheat_th                           0x60
#define tempsen_top_tempsen_auto_cycle                    0x64
#define tempsen_top_tempsen_auto_prediv                   0x64
#define tempsen_top_tempsen_overheat_ctrl                 0x68
#define tempsen_top_tempsen_overheat_countdown            0x6c
#define tempsen_top_tempsen_ch0_temp_th_cnt               0x70
#define tempsen_top_tempsen_ch1_temp_th_cnt               0x74
#define tempsen_top_tempsen_ch2_temp_th_cnt               0x78
#define tempsen_top_tempsen_ch3_temp_th_cnt               0x7c
#define tempsen_top_tempsen_test_force                    0x80
#define tempsen_top_reg_ip_version                        0x0
#define tempsen_top_reg_ip_version_OFFSET                 0
#define tempsen_top_reg_ip_version_MASK                   0xffffffff
#define tempsen_top_reg_tempsen_en                        0x4
#define tempsen_top_reg_tempsen_en_OFFSET                 0
#define tempsen_top_reg_tempsen_en_MASK                   0x1
#define tempsen_top_reg_tempsen_sel                       0x4
#define tempsen_top_reg_tempsen_sel_OFFSET                4
#define tempsen_top_reg_tempsen_sel_MASK                  0xf0
#define tempsen_top_reg_tempsen_ovhl_cnt_to_irq           0x4
#define tempsen_top_reg_tempsen_ovhl_cnt_to_irq_OFFSET    16
#define tempsen_top_reg_tempsen_ovhl_cnt_to_irq_MASK      0xff0000
#define tempsen_top_reg_tempsen_udll_cnt_to_irq           0x4
#define tempsen_top_reg_tempsen_udll_cnt_to_irq_OFFSET    24
#define tempsen_top_reg_tempsen_udll_cnt_to_irq_MASK      0xff000000
#define tempsen_top_sta_tempsen_busy                      0x8
#define tempsen_top_sta_tempsen_busy_OFFSET               0
#define tempsen_top_sta_tempsen_busy_MASK                 0x1
#define tempsen_top_reg_tempsen_bgen                      0xc
#define tempsen_top_reg_tempsen_bgen_OFFSET               0
#define tempsen_top_reg_tempsen_bgen_MASK                 0x1
#define tempsen_top_reg_tempsen_chopen                    0xc
#define tempsen_top_reg_tempsen_chopen_OFFSET             1
#define tempsen_top_reg_tempsen_chopen_MASK               0x2
#define tempsen_top_reg_tempsen_choppol                   0xc
#define tempsen_top_reg_tempsen_choppol_OFFSET            2
#define tempsen_top_reg_tempsen_choppol_MASK              0x4
#define tempsen_top_reg_tempsen_clkpol                    0xc
#define tempsen_top_reg_tempsen_clkpol_OFFSET             3
#define tempsen_top_reg_tempsen_clkpol_MASK               0x8
#define tempsen_top_reg_tempsen_chopsel                   0xc
#define tempsen_top_reg_tempsen_chopsel_OFFSET            4
#define tempsen_top_reg_tempsen_chopsel_MASK              0x30
#define tempsen_top_reg_tempsen_accsel                    0xc
#define tempsen_top_reg_tempsen_accsel_OFFSET             6
#define tempsen_top_reg_tempsen_accsel_MASK               0xc0
#define tempsen_top_reg_tempsen_cyc_clkdiv                0xc
#define tempsen_top_reg_tempsen_cyc_clkdiv_OFFSET         8
#define tempsen_top_reg_tempsen_cyc_clkdiv_MASK           0xff00
#define tempsen_top_reg_tempsen_tsel                      0xc
#define tempsen_top_reg_tempsen_tsel_OFFSET               16
#define tempsen_top_reg_tempsen_tsel_MASK                 0x30000
#define tempsen_top_sta_tempsen_intr_en                   0x10
#define tempsen_top_sta_tempsen_intr_en_OFFSET            0
#define tempsen_top_sta_tempsen_intr_en_MASK              0xffffffff
#define tempsen_top_sta_tempsen_intr_clr                  0x14
#define tempsen_top_sta_tempsen_intr_clr_OFFSET           0
#define tempsen_top_sta_tempsen_intr_clr_MASK             0xffffffff
#define tempsen_top_sta_tempsen_intr_sta                  0x18
#define tempsen_top_sta_tempsen_intr_sta_OFFSET           0
#define tempsen_top_sta_tempsen_intr_sta_MASK             0xffffffff
#define tempsen_top_sta_tempsen_intr_raw                  0x1c
#define tempsen_top_sta_tempsen_intr_raw_OFFSET           0
#define tempsen_top_sta_tempsen_intr_raw_MASK             0xffffffff
#define tempsen_top_sta_tempsen_ch0_result                0x20
#define tempsen_top_sta_tempsen_ch0_result_OFFSET         0
#define tempsen_top_sta_tempsen_ch0_result_MASK           0x1fff
#define tempsen_top_sta_tempsen_ch0_max_result            0x20
#define tempsen_top_sta_tempsen_ch0_max_result_OFFSET     16
#define tempsen_top_sta_tempsen_ch0_max_result_MASK       0x1fff0000
#define tempsen_top_clr_tempsen_ch0_max_result            0x20
#define tempsen_top_clr_tempsen_ch0_max_result_OFFSET     31
#define tempsen_top_clr_tempsen_ch0_max_result_MASK       0x80000000
#define tempsen_top_sta_tempsen_ch1_result                0x24
#define tempsen_top_sta_tempsen_ch1_result_OFFSET         0
#define tempsen_top_sta_tempsen_ch1_result_MASK           0x1fff
#define tempsen_top_sta_tempsen_ch1_max_result            0x24
#define tempsen_top_sta_tempsen_ch1_max_result_OFFSET     16
#define tempsen_top_sta_tempsen_ch1_max_result_MASK       0x1fff0000
#define tempsen_top_clr_tempsen_ch1_max_result            0x24
#define tempsen_top_clr_tempsen_ch1_max_result_OFFSET     31
#define tempsen_top_clr_tempsen_ch1_max_result_MASK       0x80000000
#define tempsen_top_sta_tempsen_ch2_result                0x28
#define tempsen_top_sta_tempsen_ch2_result_OFFSET         0
#define tempsen_top_sta_tempsen_ch2_result_MASK           0x1fff
#define tempsen_top_sta_tempsen_ch2_max_result            0x28
#define tempsen_top_sta_tempsen_ch2_max_result_OFFSET     16
#define tempsen_top_sta_tempsen_ch2_max_result_MASK       0x1fff0000
#define tempsen_top_clr_tempsen_ch2_max_result            0x28
#define tempsen_top_clr_tempsen_ch2_max_result_OFFSET     31
#define tempsen_top_clr_tempsen_ch2_max_result_MASK       0x80000000
#define tempsen_top_sta_tempsen_ch3_result                0x2c
#define tempsen_top_sta_tempsen_ch3_result_OFFSET         0
#define tempsen_top_sta_tempsen_ch3_result_MASK           0x1fff
#define tempsen_top_sta_tempsen_ch3_max_result            0x2c
#define tempsen_top_sta_tempsen_ch3_max_result_OFFSET     16
#define tempsen_top_sta_tempsen_ch3_max_result_MASK       0x1fff0000
#define tempsen_top_clr_tempsen_ch3_max_result            0x2c
#define tempsen_top_clr_tempsen_ch3_max_result_OFFSET     31
#define tempsen_top_clr_tempsen_ch3_max_result_MASK       0x80000000
#define tempsen_top_reg_tempsen_ddr_out_en                0x30
#define tempsen_top_reg_tempsen_ddr_out_en_OFFSET         0
#define tempsen_top_reg_tempsen_ddr_out_en_MASK           0x1
#define tempsen_top_reg_tempsen_ddr_ow_en                 0x30
#define tempsen_top_reg_tempsen_ddr_ow_en_OFFSET          1
#define tempsen_top_reg_tempsen_ddr_ow_en_MASK            0x2
#define tempsen_top_reg_tempsen_ddr_ow_val                0x30
#define tempsen_top_reg_tempsen_ddr_ow_val_OFFSET         2
#define tempsen_top_reg_tempsen_ddr_ow_val_MASK           0x4
#define tempsen_top_sta_tempsen_ddr_high_temp_raw         0x30
#define tempsen_top_sta_tempsen_ddr_high_temp_raw_OFFSET  8
#define tempsen_top_sta_tempsen_ddr_high_temp_raw_MASK    0xf00
#define tempsen_top_sta_tempsen_ddr_high_temp_o           0x30
#define tempsen_top_sta_tempsen_ddr_high_temp_o_OFFSET    12
#define tempsen_top_sta_tempsen_ddr_high_temp_o_MASK      0xf000
#define tempsen_top_reg_tempsen_ddr_hi_th                 0x34
#define tempsen_top_reg_tempsen_ddr_hi_th_OFFSET          0
#define tempsen_top_reg_tempsen_ddr_hi_th_MASK            0x1fff
#define tempsen_top_reg_tempsen_ddr_lo_th                 0x34
#define tempsen_top_reg_tempsen_ddr_lo_th_OFFSET          16
#define tempsen_top_reg_tempsen_ddr_lo_th_MASK            0x1fff0000
#define tempsen_top_reg_tempsen_ch0_hi_th                 0x40
#define tempsen_top_reg_tempsen_ch0_hi_th_OFFSET          0
#define tempsen_top_reg_tempsen_ch0_hi_th_MASK            0x1fff
#define tempsen_top_reg_tempsen_ch0_lo_th                 0x40
#define tempsen_top_reg_tempsen_ch0_lo_th_OFFSET          16
#define tempsen_top_reg_tempsen_ch0_lo_th_MASK            0x1fff0000
#define tempsen_top_reg_tempsen_ch1_hi_th                 0x44
#define tempsen_top_reg_tempsen_ch1_hi_th_OFFSET          0
#define tempsen_top_reg_tempsen_ch1_hi_th_MASK            0x1fff
#define tempsen_top_reg_tempsen_ch1_lo_th                 0x44
#define tempsen_top_reg_tempsen_ch1_lo_th_OFFSET          16
#define tempsen_top_reg_tempsen_ch1_lo_th_MASK            0x1fff0000
#define tempsen_top_reg_tempsen_ch2_hi_th                 0x48
#define tempsen_top_reg_tempsen_ch2_hi_th_OFFSET          0
#define tempsen_top_reg_tempsen_ch2_hi_th_MASK            0x1fff
#define tempsen_top_reg_tempsen_ch2_lo_th                 0x48
#define tempsen_top_reg_tempsen_ch2_lo_th_OFFSET          16
#define tempsen_top_reg_tempsen_ch2_lo_th_MASK            0x1fff0000
#define tempsen_top_reg_tempsen_ch3_hi_th                 0x4c
#define tempsen_top_reg_tempsen_ch3_hi_th_OFFSET          0
#define tempsen_top_reg_tempsen_ch3_hi_th_MASK            0x1fff
#define tempsen_top_reg_tempsen_ch3_lo_th                 0x4c
#define tempsen_top_reg_tempsen_ch3_lo_th_OFFSET          16
#define tempsen_top_reg_tempsen_ch3_lo_th_MASK            0x1fff0000
#define tempsen_top_reg_tempsen_overheat_th               0x60
#define tempsen_top_reg_tempsen_overheat_th_OFFSET        0
#define tempsen_top_reg_tempsen_overheat_th_MASK          0x1fff
#define tempsen_top_reg_tempsen_auto_cycle                0x64
#define tempsen_top_reg_tempsen_auto_cycle_OFFSET         0
#define tempsen_top_reg_tempsen_auto_cycle_MASK           0xffffff
#define tempsen_top_reg_tempsen_auto_prediv               0x64
#define tempsen_top_reg_tempsen_auto_prediv_OFFSET        24
#define tempsen_top_reg_tempsen_auto_prediv_MASK          0xff000000
#define tempsen_top_reg_tempsen_overheat_cycle            0x68
#define tempsen_top_reg_tempsen_overheat_cycle_OFFSET     0
#define tempsen_top_reg_tempsen_overheat_cycle_MASK       0x3fffffff
#define tempsen_top_reg_overheat_reset_clr                0x68
#define tempsen_top_reg_overheat_reset_clr_OFFSET         30
#define tempsen_top_reg_overheat_reset_clr_MASK           0x40000000
#define tempsen_top_reg_overheat_reset_en                 0x68
#define tempsen_top_reg_overheat_reset_en_OFFSET          31
#define tempsen_top_reg_overheat_reset_en_MASK            0x80000000
#define tempsen_top_sta_tempsen_overheat_countdown        0x6c
#define tempsen_top_sta_tempsen_overheat_countdown_OFFSET 0
#define tempsen_top_sta_tempsen_overheat_countdown_MASK   0x3fffffff
#define tempsen_top_sta_overheat_reset                    0x6c
#define tempsen_top_sta_overheat_reset_OFFSET             31
#define tempsen_top_sta_overheat_reset_MASK               0x80000000
#define tempsen_top_sta_ch0_over_hi_temp_th_cnt           0x70
#define tempsen_top_sta_ch0_over_hi_temp_th_cnt_OFFSET    0
#define tempsen_top_sta_ch0_over_hi_temp_th_cnt_MASK      0xff
#define tempsen_top_sta_ch0_under_lo_temp_th_cnt          0x70
#define tempsen_top_sta_ch0_under_lo_temp_th_cnt_OFFSET   8
#define tempsen_top_sta_ch0_under_lo_temp_th_cnt_MASK     0xff00
#define tempsen_top_reg_ch0_temp_th_cnt_clr               0x70
#define tempsen_top_reg_ch0_temp_th_cnt_clr_OFFSET        16
#define tempsen_top_reg_ch0_temp_th_cnt_clr_MASK          0x10000
#define tempsen_top_sta_ch1_over_hi_temp_th_cnt           0x74
#define tempsen_top_sta_ch1_over_hi_temp_th_cnt_OFFSET    0
#define tempsen_top_sta_ch1_over_hi_temp_th_cnt_MASK      0xff
#define tempsen_top_sta_ch1_under_lo_temp_th_cnt          0x74
#define tempsen_top_sta_ch1_under_lo_temp_th_cnt_OFFSET   8
#define tempsen_top_sta_ch1_under_lo_temp_th_cnt_MASK     0xff00
#define tempsen_top_reg_ch1_temp_th_cnt_clr               0x74
#define tempsen_top_reg_ch1_temp_th_cnt_clr_OFFSET        16
#define tempsen_top_reg_ch1_temp_th_cnt_clr_MASK          0x10000
#define tempsen_top_sta_ch2_over_hi_temp_th_cnt           0x78
#define tempsen_top_sta_ch2_over_hi_temp_th_cnt_OFFSET    0
#define tempsen_top_sta_ch2_over_hi_temp_th_cnt_MASK      0xff
#define tempsen_top_sta_ch2_under_lo_temp_th_cnt          0x78
#define tempsen_top_sta_ch2_under_lo_temp_th_cnt_OFFSET   8
#define tempsen_top_sta_ch2_under_lo_temp_th_cnt_MASK     0xff00
#define tempsen_top_reg_ch2_temp_th_cnt_clr               0x78
#define tempsen_top_reg_ch2_temp_th_cnt_clr_OFFSET        16
#define tempsen_top_reg_ch2_temp_th_cnt_clr_MASK          0x10000
#define tempsen_top_sta_ch3_over_hi_temp_th_cnt           0x7c
#define tempsen_top_sta_ch3_over_hi_temp_th_cnt_OFFSET    0
#define tempsen_top_sta_ch3_over_hi_temp_th_cnt_MASK      0xff
#define tempsen_top_sta_ch3_under_lo_temp_th_cnt          0x7c
#define tempsen_top_sta_ch3_under_lo_temp_th_cnt_OFFSET   8
#define tempsen_top_sta_ch3_under_lo_temp_th_cnt_MASK     0xff00
#define tempsen_top_reg_ch3_temp_th_cnt_clr               0x7c
#define tempsen_top_reg_ch3_temp_th_cnt_clr_OFFSET        16
#define tempsen_top_reg_ch3_temp_th_cnt_clr_MASK          0x10000
#define tempsen_top_reg_tempsen_force_result              0x80
#define tempsen_top_reg_tempsen_force_result_OFFSET       0
#define tempsen_top_reg_tempsen_force_result_MASK         0x1fff
#define tempsen_top_reg_tempsen_force_valid               0x80
#define tempsen_top_reg_tempsen_force_valid_OFFSET        13
#define tempsen_top_reg_tempsen_force_valid_MASK          0x2000
#define tempsen_top_reg_tempsen_force_busy                0x80
#define tempsen_top_reg_tempsen_force_busy_OFFSET         14
#define tempsen_top_reg_tempsen_force_busy_MASK           0x4000
#define tempsen_top_reg_tempsen_force_en                  0x80
#define tempsen_top_reg_tempsen_force_en_OFFSET           15
#define tempsen_top_reg_tempsen_force_en_MASK             0x8000

#define RTC_EN_THM_SHDN 0xc4
#define HW_THM_SHDN_EN 0x8

#define TEMPSENSER_NUM 1

#define MAX_OF_THREE(a, b, c) (a > b ? (a > c ? a : c) : (b > c ? b : c))

struct bm_thermal_zone {
    unsigned int ch;
    void __iomem *base;
    struct bm_thermal *ct;
};

struct bm_thermal {
    struct device *dev;
    void __iomem *base;
    struct clk *clk_tempsen;
};

int bm_read_temp(struct bm_device_info *bmdi, int *temperature);
void bm_thermal_uninit(struct bm_device_info *bmdi);
void bm_thermal_init(struct bm_device_info *bmdi);

#endif